package org.jederik.studip.android.sync;

import org.jederik.android.provider.StudIP;
import org.jederik.android.provider.StudIP.Feed;
import org.jederik.studip.android.Const;
import org.jederik.studip.android.R;
import org.jederik.studip.android.view.FeedActivity;
import org.jederik.studip.android.view.Preferences;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences.Editor;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

/**
 * Service, der in regelmäßigen Abständen die Synchronisation des Feed, die 
 * Aktualisierung der Liste "Meine Veranstaltungen" und ggf. den 
 * Stundenplanimport bewirkt.
 * @author Jann-Frederik Laß
 *
 */
public class CheckChangesService extends Service {
	
	private static final String TAG = "CheckChangesService";
	

	// Service aktiv?
	private boolean checking = false;
	
	// Handler der in regelmäßigen Abständen den mSyncer ausführt:
	private Handler mHandler = new Handler();
	
	// Runnable das den SyncService aktiviert:
	private Runnable mSyncer = new Runnable() {
		
		@Override
		public void run() {
			
			// Intent an SyncService senden:
			Intent sync = new Intent(Intent.ACTION_SYNC, StudIP.CONTENT_URI);
			startService(sync);
			
			// Nach gewisser Zeit wiederholen:
			mHandler.postDelayed(mSyncer, getUpdateFrequency());
			
		}
		
	};
	
	private long getUpdateFrequency() {
		return Long.parseLong(Preferences.getPreferences(getApplicationContext())
		.getString(Preferences.UPDATE_FREQUENCY, "1800000"));
	}

	/*
	 * ContentObserver, der eine Benachrichtigung in der Statusleiste anzeigt,
	 * wenn es neue Feed-Einträge gibt.
	 */
	private final ContentObserver mNotifier = new ContentObserver(new Handler()) {

		@Override
		public void onChange(boolean selfChange) {
			placeNotification();
		}
	};
	
	/*
	 * Fügt eine Benachrichtigung in die Statusleiste von Android ein.
	 */
	private void placeNotification() {

		// Anzahl der Änderungen zu jedem Resourcentyp aus Datenbank holen:
		Cursor notifications = getContentResolver().query(
				StudIP.Notifications.CONTENT_URI, 
				null, 
				null, 
				null, 
				null);
		
		// Sind überhaupt neue Änderungen vorhanden?
		if (notifications.getCount() == 0) return;

		// NotificationManager anfordern:
		NotificationManager nm = (NotificationManager) getSystemService(
				Context.NOTIFICATION_SERVICE);

		// Nptification zusammenstellen:
		Notification n = new Notification(
				R.drawable.status_bar_icon,
				getString(R.string.notification_message),
				System.currentTimeMillis()
		);

		// Standard Notification Sound hinzufügen:
		n.defaults |= Notification.DEFAULT_SOUND;

		// Intent zum Anzeigen des Feed erzeugen:
		Intent viewFeed = new Intent(CheckChangesService.this, FeedActivity.class);
		
		// Beim anzeigen des Feed Icon aus Statusleiste entfernen:
		viewFeed.putExtra(FeedActivity.REMOVE_NOTIFICATIONS, true);

		// Intent in PendingIntent verpacken:
		PendingIntent pi = PendingIntent.getActivity(
				getApplicationContext(), 0, viewFeed, 0);

		// Detailinformationen zur Notification setzen:
		n.setLatestEventInfo(
				getApplicationContext(), 
				getString(R.string.app_name), 
				getString(R.string.notification_message), 
				pi);

		// Notification anzeigen:
		nm.notify(Const.NOTIFICATION_ID, n);

	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);

		// Läuft schon?
		if (checking) return;

		// Feed unter Beobachtung stellen:
		getContentResolver().registerContentObserver(Feed.CONTENT_URI, false, mNotifier);
		
		// regelmäßige Überprüfung starten:
		mHandler.post(mSyncer);
		
		checking = true;

		// Nutzer über starten des Hintergrundservice benachrichtigen:
		Toast.makeText(this, R.string.service_startet, Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		
		// Läuft der Service überhaupt?
		if (!checking) return;
		
		// regelmäßige Überprüfung beenden:
		mHandler.removeCallbacks(mSyncer);
		
		// Feed nicht mehr beobachten:
		getContentResolver().unregisterContentObserver(mNotifier);
		
		checking = false;
		
		// Häkchen in den Einstellungen entfernen, damit der Nutzer sieht, daß 
		// der Service nicht läuft:
		Editor editor = Preferences.getPreferences(this).edit();
		editor.putBoolean(Preferences.CHECK_CHANGES, false);
		editor.commit();
		
		// Benutzer über Stoppen des Service benachrichtigen:
		Toast.makeText(this, R.string.service_stopped, Toast.LENGTH_SHORT).show();
		
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

}
